package com.pan.kang.data.Impl;


import cn.hutool.core.date.DateUtil;
import com.pan.kang.constant.FieldTypeEnum;
import com.pan.kang.data.DataGenerator;
import com.pan.kang.model.TableSchema;
import net.datafaker.Faker;
import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.util.*;

/**
 * 固定值数据生成器
 */
public class DefaultDataGenerator implements DataGenerator {


    private final static Faker ZH_FAKER = new Faker(new Locale("zh-CN"));


    @Override
    public List<String> doGenerate(TableSchema.Field field, int rowNum) {
        List<String> list = new ArrayList<>(rowNum);
        // 主键处理
        if (field.isPrimaryKey() || field.getFieldName().contains("id")) {
            // 递增
            if (field.isAutoIncrement()) {
                int initValue = 1;
                for (int i = 0; i < rowNum; i++) {
                    list.add(String.valueOf(initValue + i));
                }
            } else {
                // UUID
                for (int i = 0; i < rowNum; i++) {
                    list.add(String.valueOf(UUID.randomUUID()).replaceAll("-", ""));
                }
            }
            return list;
        }
        // 使用默认值
        String defaultValue = field.getDefaultValue();
        if (StringUtils.isNotBlank(defaultValue) && !"NULL".equals(defaultValue.toUpperCase(Locale.ROOT))) {
            for (int i = 0; i < rowNum; i++) {
                list.add(defaultValue);
            }
            return list;
        } else {
            // 默认值为空，使用模拟数据
            String mockParams = field.getMockParams();
            if (StringUtils.isNotBlank(mockParams)) {
                for (int i = 0; i < rowNum; i++) {
                    list.add(mockParams);
                }
                return list;
            } else {
                // 模拟数据为空，根据类型初始化值
                String fieldType = field.getFieldType();
                for (int i = 0; i < rowNum; i++) {
                    if (fieldType.toLowerCase(Locale.ROOT).contains(FieldTypeEnum.DATETIME.getValue()
                            .toLowerCase(Locale.ROOT))) {
                        list.add(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
                    } else if (fieldType.toLowerCase(Locale.ROOT).contains(FieldTypeEnum.INT.getValue())) {
                        list.add(String.valueOf(ZH_FAKER.random().nextInt(999999)));
                    } else if (fieldType.toLowerCase(Locale.ROOT).contains(FieldTypeEnum.VARCHAR.getValue())) {
                        // 默认取动物
                        list.add(ZH_FAKER.animal().name());
                    } else if (fieldType.toLowerCase(Locale.ROOT).contains(FieldTypeEnum.DECIMAL.getValue())) {
                        list.add(String.valueOf(BigDecimal.ZERO));
                    }
                }
                return list;
            }
        }
    }
}
